﻿//
//                       _oo0oo_
//                      o8888888o
//                      88" . "88
//                      (| -_- |)
//                      0\  =  /0
//                    ___/`---'\___
//                  .' \\|     |// '.
//                 / \\|||  :  |||// \
//                / _||||| -:- |||||- \
//               |   | \\\  -  /// |   |
//               | \_|  ''\---/''  |_/ |
//               \  .-\__  '-'  ___/-. /
//             ___'. .'  /--.--\  `. .'___
//          ."" '<  `.___\_<|>_/___.' >' "".
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//         \  \ `_.   \_ __\ /__ _/   .-` /  /
//     =====`-.____`.___ \_____/___.-`___.-'=====
//                       `=---='
//
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//               佛祖保佑         永无BUG
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#region << 版 本 注 释 >>

/*----------------------------------------------------------------
* 类 名 称 ：IStateMachineManager
* 类 描 述 ：
* 作    者 ：henrychang
* 创建时间 ：2019/1/28 9:44:35
*******************************************************************
* Copyright @ henrychang 2018. All rights reserved.
*******************************************************************
//----------------------------------------------------------------*/

#endregion << 版 本 注 释 >>

using System;
using System.Collections.Generic;

namespace TouchFish.StateMachine
{
    /// <summary>
    /// 状态机管理器。
    /// </summary>
    public interface IStateMachineManager
    {
        /// <summary>
        /// 获取状态机数量。
        /// </summary>
        int Count
        {
            get;
        }

        ///// <summary>
        ///// 检查是否存在状态机。
        ///// </summary>
        ///// <typeparam name="T">状态机持有者类型。</typeparam>
        ///// <returns>是否存在有限状态机。</returns>
        //bool HasFsm<T>() where T : class;

        ///// <summary>
        ///// 检查是否存在状态机。
        ///// </summary>
        ///// <param name="ownerType">状态机持有者类型。</param>
        ///// <returns>是否存在状态机。</returns>
        //bool HasFsm(Type ownerType);

        ///// <summary>
        ///// 检查是否存在状态机。
        ///// </summary>
        ///// <typeparam name="T">状态机持有者类型。</typeparam>
        ///// <param name="name">状态机名称。</param>
        ///// <returns>是否存在状态机。</returns>
        //bool HasFsm<T>(string name) where T : class;

        ///// <summary>
        ///// 检查是否存在状态机。
        ///// </summary>
        ///// <param name="ownerType">状态机持有者类型。</param>
        ///// <param name="name">状态机名称。</param>
        ///// <returns>是否存在状态机。</returns>
        //bool HasFsm(Type ownerType, string name);

        ///// <summary>
        ///// 获取状态机。
        ///// </summary>
        ///// <typeparam name="T">状态机持有者类型。</typeparam>
        ///// <returns>要获取的状态机。</returns>
        //IStateMachine<T> GetFsm<T>() where T : class;

        ///// <summary>
        ///// 获取状态机。
        ///// </summary>
        ///// <param name="ownerType">状态机持有者类型。</param>
        ///// <returns>要获取的有限状态机。</returns>
        //StateMachineBase GetFsm(Type ownerType);

        ///// <summary>
        ///// 获取状态机。
        ///// </summary>
        ///// <typeparam name="T">状态机持有者类型。</typeparam>
        ///// <param name="name">状态机名称。</param>
        ///// <returns>要获取的状态机。</returns>
        //IStateMachine<T> GetFsm<T>(string name) where T : class;

        ///// <summary>
        ///// 获取状态机。
        ///// </summary>
        ///// <param name="ownerType">状态机持有者类型。</param>
        ///// <param name="name">状态机名称。</param>
        ///// <returns>要获取的状态机。</returns>
        //StateMachineBase GetFsm(Type ownerType, string name);

        ///// <summary>
        ///// 获取所有状态机。
        ///// </summary>
        ///// <returns>所有状态机。</returns>
        //StateMachineBase[] GetAllFsms();

        ///// <summary>
        ///// 获取所有状态机。
        ///// </summary>
        ///// <param name="results">所有状态机。</param>
        //void GetAllFsms(List<StateMachineBase> results);

        /// <summary>
        /// 创建状态机。
        /// </summary>
        /// <typeparam name="T">状态机持有者类型。</typeparam>
        /// <param name="owner">状态机持有者。</param>
        /// <param name="states">状态机状态集合。</param>
        /// <returns>要创建的状态机。</returns>
        IStateMachine<T> CreateFsm<T>(T owner, params State<T>[] states) where T : class;

        /// <summary>
        /// 创建状态机。
        /// </summary>
        /// <typeparam name="T">状态机持有者类型。</typeparam>
        /// <param name="name">状态机名称。</param>
        /// <param name="owner">状态机持有者。</param>
        /// <param name="states">状态机状态集合。</param>
        /// <returns>要创建的状态机。</returns>
        IStateMachine<T> CreateFsm<T>(string name, T owner, params State<T>[] states) where T : class;

        ///// <summary>
        ///// 销毁状态机。
        ///// </summary>
        ///// <typeparam name="T">状态机持有者类型。</typeparam>
        ///// <returns>是否销毁状态机成功。</returns>
        //bool DestroyFsm<T>() where T : class;

        ///// <summary>
        ///// 销毁状态机。
        ///// </summary>
        ///// <param name="ownerType">状态机持有者类型。</param>
        ///// <returns>是否销毁状态机成功。</returns>
        //bool DestroyFsm(Type ownerType);

        ///// <summary>
        ///// 销毁状态机。
        ///// </summary>
        ///// <typeparam name="T">状态机持有者类型。</typeparam>
        ///// <param name="name">要销毁的状态机名称。</param>
        ///// <returns>是否销毁有限状态机成功。</returns>
        //bool DestroyFsm<T>(string name) where T : class;

        ///// <summary>
        ///// 销毁有状态机。
        ///// </summary>
        ///// <param name="ownerType">状态机持有者类型。</param>
        ///// <param name="name">要销毁的状态机名称。</param>
        ///// <returns>是否销毁状态机成功。</returns>
        //bool DestroyFsm(Type ownerType, string name);

        ///// <summary>
        ///// 销毁状态机。
        ///// </summary>
        ///// <typeparam name="T">状态机持有者类型。</typeparam>
        ///// <param name="fsm">要销毁的状态机。</param>
        ///// <returns>是否销毁状态机成功。</returns>
        //bool DestroyFsm<T>(IStateMachine<T> fsm) where T : class;

        ///// <summary>
        ///// 销毁状态机。
        ///// </summary>
        ///// <param name="fsm">要销毁的状态机。</param>
        ///// <returns>是否销毁状态机成功。</returns>
        //bool DestroyFsm(StateMachineBase fsm);
    }
}